package com.fadada.api;


import com.fasc.open.api.bean.base.BaseRes;
import com.fasc.open.api.bean.common.CorpIdentInfo;
import com.fasc.open.api.bean.common.CorpInfoExtend;
import com.fasc.open.api.bean.common.UserIdentInfo;
import com.fasc.open.api.bean.common.UserInfoExtend;
import com.fasc.open.api.bean.req.corp.*;
import com.fasc.open.api.bean.res.common.EUrlRes;
import com.fasc.open.api.bean.res.corp.*;
import com.fasc.open.api.client.CorpClient;
import com.fasc.open.api.enums.common.AuthScopeEnum;
import com.fasc.open.api.enums.corp.CorpIdentTypeEnum;
import com.fasc.open.api.enums.corp.OperatorTypeEnum;
import com.fasc.open.api.exception.ApiException;
import com.fasc.open.api.utils.ResultUtil;

import java.util.Arrays;

/**
 * @author FDD
 * @version 0.0.1
 * @ClassName CorpDemo.java
 * @Description 企业帐号管理接口demo
 * @Param
 * @createTime 2021年10月22日 15:36:00
 */
public class CorpDemo extends BaseDemo{

    private static CorpClient corpClient;

    public static void main(String[] args) {
        try{
            BaseDemo baseDemo = new BaseDemo();
            openApiClient = baseDemo.getClient();
            corpClient = new CorpClient(openApiClient);
            //获取应用accessToken
            accessToken = baseDemo.getAccessToken(openApiClient);
            //添加企业
            corpAdd();
            //修改企业
            corpUpdate();
            //删除企业
            corpDelete();
            //禁用企业用户
            corpDisable();
            //恢复企业用户
            corpEnable();
            //获取企业用户授权链接
            corpGetAuthUrl();
            //获取企业用户基本信息
            corpGet();
            //获取企业用户身份信息
            getIdentityInfo();
        }catch (ApiException e){
            e.printStackTrace();
        }
    }

    /**
     * 添加企业
     *
     * **接口说明：**把应用系统上将要使用法大大电子签服务的企业添加到法大大平台。法大大平台会为这些企业分配在该appId范围内的唯一标识openCorpId。后续，针对该企业进行的授权请求、签署任务等调用都将使用该openCorpId标识该企业。您可以在应该管理后台查看和管理已经添加的企业。
     *
     * **适用场景：**应用系统上的企业需要使用法大大电子签服务时，可通过该接口将其添加到法大大平台，为后续请求授权、参与签署任务做好准备。这是应用系统上的任何企业要使用法大大电子签服务前，应用系统要做的第一步调用。
     *
     * **注意：**应用系统应该将返回的openCorpId存储在自己的数据库中，并和设定的clientCorpId建立一一对应关系，以便于后续的其他接口调用使用该参数。如果应用系统的归属企业(接入方)自己也在该应用系统上使用法大大电子签服务，也需要调用本接口将自身企业添加到法大大平台。
     */
    public static void corpAdd() throws ApiException{
        AddCorpReq addcorpReq = new AddCorpReq();
        addcorpReq.setAccessToken(accessToken);
        //企业在应用系统中的唯一标识，具体取值的选择和编码格式取决于应用系统和开发者。要求在一个appId范围内具有唯一性。
        addcorpReq.setClientCorpId("企业id");
        //企业名称，便于在使用和管理时的可辨识性，建议使用企业全称。最大长度100个字符。
        addcorpReq.setClientCorpName("企业名称");
        BaseRes<AddOpenCorpRes> res = corpClient.add(addcorpReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 更新企业信息
     *
     * **接口说明：**为已添加的企业修改在应用系统中的关联参数。
     *
     * **适用场景：**企业在应用系统的标识(clientCorpId)或其他信息产生了变化，需要更新关联关系和参数时调用。
     */
    public static void corpUpdate() throws ApiException{
        UpdateCorpReq updateCorpReq = new UpdateCorpReq();
        updateCorpReq.setAccessToken(accessToken);
        //法大大平台为该企业在该应用appId范围内分配的唯一标识。
        updateCorpReq.setOpenCorpId(openCorpId);
        //企业在应用系统中的唯一标识。
        updateCorpReq.setClientCorpId("企业id");
        //企业名称，便于在使用和管理时的可辨识性，建议使用企业全称。最大长度100个字符。
        updateCorpReq.setClientCorpName("企业名称");
        BaseRes<Void> res = corpClient.update(updateCorpReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 删除企业
     *
     * **接口说明：**删除企业。删除后再次使用相同的clientCorpId添加该企业时，可能返回新的openCorpId。
     *
     * **适用场景：**用于企业在应用系统上不再需要使用法大大电子签服务的场景。
     */
    public static void corpDelete() throws ApiException{
        DeleteCorpReq deleteCorpReq = new DeleteCorpReq();
        deleteCorpReq.setAccessToken(accessToken);
        //法大大平台为该企业在该应用appId范围内分配的唯一标识。
        deleteCorpReq.setOpenCorpId(openCorpId);
        BaseRes<Void> res = corpClient.delete(deleteCorpReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 禁用企业用户
     *
     * **接口说明：**将已添加的企业用户暂时禁用。禁用后，该企业暂时不能通过该应用系统使用法大大平台服务。
     *
     * **适用场景：**用于需要暂时对企业用户停止服务，却不希望删除的场景。禁用后还可以激活。根据您的公司和法大大签署的订阅协议，如果法大大平台限制了您的应用系统的企业用户数量，禁用的企业用户将不占用该限制的名额。
     */
    public static void corpDisable() throws ApiException{
        DisableCorpReq disableCorpReq = new DisableCorpReq();
        disableCorpReq.setAccessToken(accessToken);
        //法大大平台为该企业在该应用appId范围内分配的唯一标识。
        disableCorpReq.setOpenCorpId(openCorpId);
        BaseRes<Void> res = corpClient.disable(disableCorpReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 恢复企业用户
     *
     * **接口说明：**将已禁用的企业用户再次激活。激活后，该企业用户可继续通过该应用系统使用法大大平台服务。
     *
     * **适用场景：**恢复对已禁用的企业用户的服务。
     *
     */
    public static void corpEnable() throws ApiException{
        EnableCorpReq enableCorpReq = new EnableCorpReq();
        enableCorpReq.setAccessToken(accessToken);
        //法大大平台为该企业在该应用appId范围内分配的唯一标识。
        enableCorpReq.setOpenCorpId(openCorpId);
        BaseRes<Void> res = corpClient.enable(enableCorpReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }


    /**
     * 获取企业用户授权链接
     *
     * **接口说明：**应用系统向法大大平台获取一个页面链接，用于提醒企业经办人进行授权操作，以授权应用系统访问该企业在法大大平台的某些数据和操作权限。在企业操作授权前，法大大平台要求企业及其经办人必须先完成登录和实名认证 (即: Authorization的前提是必须先完成Authentication)。
     *
     * **适用场景：**添加企业用户后，在该企业使用法大大电子签服务前，应用系统可根据自身业务流程设计，先提醒企业经办人进行授权。应用系统必须得到企业授权后方可访问该企业的数据信息(如企业身份信息)和有权进行某些操作(如发起签署任务)。若企业只需被动参与签署任务的填写或签署，因为相关操作是企业经办人自身操作的行为，则无需使用本授权流程。
     *
     * **注意：** **企业授权**是非常重要的环节，它保障您的业务系统符《中华人民共和国个人信息保护法》及《网络数据安全管理条例》等相关法律法规的关键，请在设计时认真对待。如需要相关支持，可咨询法大大服务支持人员和法律专家。
     */
    public static void corpGetAuthUrl() throws ApiException {
        GetCorpAuthUrlReq getCorpAuthUrlReq = new GetCorpAuthUrlReq();
        getCorpAuthUrlReq.setAccessToken(accessToken);
        //法大大平台为该企业在该应用appId范围内分配的唯一标识。
        getCorpAuthUrlReq.setOpenCorpId(openCorpId);
        //企业身份信息。可以指定，也可以不指定。
        CorpIdentInfo corpIdentInfo = new CorpIdentInfo();
        corpIdentInfo.setCorpIdentType(CorpIdentTypeEnum.CORP.getCode());
        corpIdentInfo.setCorpName("公司名称");
        getCorpAuthUrlReq.setCorpIdentInfo(corpIdentInfo);
        //是否指定企业身份信息强制一致：false: 不强制一致，不必检查一致性，新认证时可修改；true: 强制一致，需检查一致性，且新认证时不可修改。缺省为false。
        getCorpAuthUrlReq.setCorpIdentInfoMatch(false);
        //企业经办人的openUserId。作为企业的经办人，也是应用系统的用户，也需要预先通过[添加个人用户](#添加个人用户)接口添加成用户。
        getCorpAuthUrlReq.setOperatorId(openUserId);
        //企业经办人身份信息。可以指定，也可以不指定。
        //**暂行限制备注：**企业经办人身份信息目前必须满足如下条件，否则无法作为企业认证的经办人：<br />1. 如该经办人已认证，认证的证件类型必须为**身份证**；<br />2. 如该经办人尚未认证，调用该接口时如指定了证件类型，证件类型必须为**身份证**。
        UserIdentInfo operatorIdentInfo = new UserIdentInfo();
        getCorpAuthUrlReq.setOperatorIdentInfo(operatorIdentInfo);
        //企业经办人补充信息。可以提供，也可以不提供。
        UserInfoExtend operatorInfoExtend = new UserInfoExtend();
        getCorpAuthUrlReq.setOperatorInfoExtend(operatorInfoExtend);
        //是否指定企业经办身份信息强制一致：false: 不强制一致，不必检查一致性，新认证时可修改；true: 强制一致，需检查一致性，且新认证时不可修改。缺省为false。
        getCorpAuthUrlReq.setOperatorIdentInfoMatch(false);
        //用户授权范围列表，只有在授权范围内的权限，该应用系统才可调用。所获得链接的页面交互会提示企业管理员/经办人进行授权操作。
        //您的业务请求的企业授权范围列表：ident_info: 身份信息 (涉及企业隐私数据，需得到企业授权)
        //signtask_init: 发起签署任务 (在合同签署任务中，发起方地位特殊，需得到企业授权)
        //resource_for_sign: 签署相关数据资源 (如文档和模板等，是属于企业的，需得到用户授权)\
        //默认为空。
        //**注意：**<br />1.法大大平台将根据该参数所请求的授权范围，在企业经办人打开的授权请求页面上展示相关文案和交互，提醒企业经办人进行授权确认。企业经办人并不一定接受您所请求的所有授权范围，实际的授权状态和范围将通过redirectUrl的参数或[企业用户授权完成事件](#企业用户授权完成事件)回调通知应用系统。您也可以通过调用[查询企业基本信息](#查询企业基本信息)查询实际的授权状态和范围。<br />2. 注意调用时认真设置授权范围。例如，对于那些无需在该应用系统上发起签署任务的企业，您可能无须要求signtask_init、resource_for_sign授权。如果您无需通过接口获取企业的详细身份信息，也无需要求ident_info授权。
        String[] requestAuthScope = {AuthScopeEnum.IDENT_INFO.getCode(),AuthScopeEnum.SIGNTASK_INIT.getCode(),AuthScopeEnum.RESOURCE_FOR_SIGN.getCode()};
        getCorpAuthUrlReq.setRequestAuthScope(Arrays.asList(requestAuthScope));
        //重定向地址。即企业经办人在返回的页面上完成操作后重定向跳转到该地址，并且附带上参数。该地址是应用系统的地址，以实现用户交互在应用系统和法大大平台之间的连贯性。长度最大500个字符。
        //<**注意：**如果未设置redirectUrl，则授权完成的参数通过回调事件通知应用系统服务端。
        getCorpAuthUrlReq.setRedirectUrl("https://www.fadada.com");
        BaseRes<EUrlRes> res = corpClient.getAuthUrl(getCorpAuthUrlReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 获取企业用户基本信息
     *
     * **接口说明：**获取企业的基本信息、认证状态、授权状态和泛微等。注意：该接口返回的信息中不涉及隐私，因此不需要授权。
     *
     * **适用场景：**应用系统需管理企业帐号对应关系、校验企业信息一致性、查询企业实名认证状态和授权信息时使用。
     */
    public static void corpGet() throws ApiException{
        GetCorpReq getCorpReq = new GetCorpReq();
        getCorpReq.setAccessToken(accessToken);
        //法大大平台为该企业在该应用appId范围内分配的唯一标识。
        getCorpReq.setOpenCorpId(openCorpId);
        BaseRes<CorpRes> res = corpClient.get(getCorpReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }


    /**
     * 获取企业用户身份信息
     *
     * **接口说明：**用于获取企业的实名身份信息。注意：只有经过企业授权后，应用系统方可获得此信息。
     *
     * **适用场景：**应用系统需要对企业在法大大平台上的实名信息进行比对或数据展示来进一步确认其身份。
     *
     * **授权要求：**应用系统需提前获得的企业授权才可调用该接口。收到该接口调用后，法大大平台将检查授权信息和授权范围，如果该企业未授权，则将返回失败。参考[获取企业用户授权链接](#获取企业用户授权链接)。
     */
    public static void getIdentityInfo() throws ApiException {
        GetCorpIdentityInfoReq getCorpIdentityInfoReq = new GetCorpIdentityInfoReq();
        getCorpIdentityInfoReq.setAccessToken(accessToken);
        BaseRes<CorpIdentityInfoRes> res = corpClient.getIdentityInfo(getCorpIdentityInfoReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }


}
